/**
 * @file ecu_filter.h
 * @brief 汽车ECU滤波算法模块头文件
 * @version 1.0.0
 * @date 2024-01-20
 * 
 * @copyright Copyright (c) 2024 汽车电子软件开发部
 */

#ifndef ECU_FILTER_H
#define ECU_FILTER_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdbool.h>

/**
 * @brief 滤波器类型枚举
 */
typedef enum {
    FILTER_TYPE_MAV,        /**< 移动平均滤波器 */
    FILTER_TYPE_IIR,        /**< IIR滤波器 */
    FILTER_TYPE_FIR,        /**< FIR滤波器 */
    FILTER_TYPE_MEDIAN      /**< 中值滤波器 */
} filter_type_t;

/**
 * @brief 滤波器状态结构体
 */
typedef struct {
    filter_type_t type;     /**< 滤波器类型 */
    uint16_t order;         /**< 滤波器阶数 */
    float* coefficients;    /**< 滤波器系数 */
    float* state;           /**< 滤波器状态 */
    uint16_t state_index;   /**< 状态索引 */
    uint32_t sample_count;  /**< 采样计数 */
} filter_handle_t;

/**
 * @brief 滤波器配置结构体
 */
typedef struct {
    filter_type_t type;     /**< 滤波器类型 */
    uint16_t order;         /**< 滤波器阶数 */
    float* coefficients;    /**< 滤波器系数数组 */
    uint16_t coefficient_count; /**< 系数数量 */
} filter_config_t;

/**
 * @brief 创建滤波器实例
 * 
 * @param config 滤波器配置
 * @return filter_handle_t* 滤波器句柄，失败返回NULL
 */
filter_handle_t* filter_create(const filter_config_t* config);

/**
 * @brief 销毁滤波器实例
 * 
 * @param handle 滤波器句柄
 */
void filter_destroy(filter_handle_t* handle);

/**
 * @brief 更新滤波器并获取输出
 * 
 * @param handle 滤波器句柄
 * @param input 输入数据
 * @return float 滤波后输出
 */
float filter_update(filter_handle_t* handle, float input);

/**
 * @brief 重置滤波器状态
 * 
 * @param handle 滤波器句柄
 */
void filter_reset(filter_handle_t* handle);

/**
 * @brief 获取滤波器类型
 * 
 * @param handle 滤波器句柄
 * @return filter_type_t 滤波器类型
 */
filter_type_t filter_get_type(const filter_handle_t* handle);

/**
 * @brief 获取滤波器阶数
 * 
 * @param handle 滤波器句柄
 * @return uint16_t 滤波器阶数
 */
uint16_t filter_get_order(const filter_handle_t* handle);

#ifdef __cplusplus
}
#endif

#endif /* ECU_FILTER_H */